package com.wondream.myframework.design_pattern.singleton;

/**
 * 单例模式-懒汉加载模式 DCL单例
 *
 * volatile的可见性和有序性
 * volatile修饰的对象，会通过缓存一致性保持程序间可见性，
 * volatile通过jvm的读和写组合的四种内存屏障防止指令重排
 *
 * cpu底层是通过lock指令，对共享内存独占使用
 * lock指令的作用（锁定总线）：
 *  1> 他能将当前处理器对应缓存的内容刷新到内存，并使其他处理器对应的缓存失效
 *  2> 提供了有序的指令，该指令无法超越这个内存屏障
 */
public class Mgr02 {

    private static volatile Mgr02 INSTANCE;

    private Mgr02(){}

    public static Mgr02 getInstance(){
        if(INSTANCE == null){
            synchronized (Mgr02.class){
                if(INSTANCE == null){
                    INSTANCE = new Mgr02();
                }
            }
        }
        return INSTANCE;
    }
}
